package com.ktgj.pay.utils;

import com.google.protobuf.nano.MessageNano;
import okhttp3.*;

import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * HTTP请求工具类
 * @author Maming
 *
 */
public class OkHttpNanoUtils {
	
	// 创建请求客户端
//	private static final OkHttpClient client = new OkHttpClient();
	/*
	 *优化设置请求时间，写入超时时间、连接超时时间为80秒 
	 */
	private static final OkHttpClient client = new OkHttpClient.Builder()
												.connectTimeout(80, TimeUnit.SECONDS) //连接超时
									            .readTimeout(80, TimeUnit.SECONDS) //读取超时
									            .build();//写超时;
	
	// 创建日志对象
	private static final Logger logger = Logger.getLogger(OkHttpNanoUtils.class);
	//json格式
	public static final MediaType JSON=MediaType.parse("application/json; charset=utf-8");
	
	/**
	 * Probuffer类型请求接口，返回字节数组
	 * @author jianfei
	 * @date 2016年12月23日
	 * @company 金色世纪（技术部）
	 * @param url 接口地址
	 * @param methodName 接口方法名称
	 * @param bytes 请求参数【字节数组】ZRequest里的ZPack
	 * @return
	 */
	public static byte[]  sendPostProtStream(String url,String methodName,byte[] bytes){
		byte[] result = null;
		try {
			//设置请求类型
			MediaType type = MediaType.parse("text/x-protobuf; charset=utf-8,gzip");
			//创建基类请求
			ZRequest zRequest = new ZRequest();
			//设置请求方法名
			zRequest.setMethodName(methodName);
			//设置请求流
			zRequest.setZPack(bytes);
			// 加载请求参数
			RequestBody requestBody = RequestBody.create(type, MessageNano.toByteArray(zRequest));
			// 设置请求头信息
			Request request = new Request.Builder()
					.url(url)
					.post(requestBody)
					.header("Content-Type", "application/x-protobuf")
					.addHeader("Content-Encoding", "gzip,deflate")
					.addHeader("Content-Length", String.valueOf(MessageNano.toByteArray(zRequest).length))
					.addHeader("Connection", "Keep-Alive")
					.addHeader("Accept-Encoding", "UTF-8,gzip").build();
			// 发送请求
			Response response = client.newCall(request).execute();
			//请求响应
			if (response.isSuccessful()) {
				// 请求成功
				result = response.body().bytes();
//				System.out.println(result.length+"^_^");
				//获得反序列化的字节流
				ZResponse zResponse = ZResponse.parseFrom(result);
				if(zResponse.getIsSuccess()){
					return zResponse.getZPack();
				}else{
					// 请求失败
					logger.error("请求"+methodName+"接口失败"+zResponse.getExceptionMessage());
//					LoggerUtil.errorLogger("", "", "请求"+methodName+"接口失败"+zResponse.getExceptionMessage());
					return result;
				}
			} else {
				// 请求失败
				logger.error("请求"+methodName+"接口失败");
//				LoggerUtil.errorLogger("", "", "请求"+methodName+"接口失败");
				return result;
			}
			
		} catch (IOException e) {
			logger.error(e.toString());
			e.printStackTrace();
			return result;
		}
		
	}
	
	/**
	 * 发送get请求
	 * @author jianfei
	 * @date 2016年12月27日
	 * @company 金色世纪（技术部）
	 * @param url
	 * @return
	 */
	public static String sendGet(String url){
		Request request = new Request.Builder()
		  .url(url)
		  .get()
		  .addHeader("cache-control", "no-cache")
		  .addHeader("postman-token", "f0949df1-abdd-2b1d-20e2-62d2297a214b")
		  .build();
		try {
			Response response = client.newCall(request).execute();
//			System.out.println(response.body().string());
			return response.body().string();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	
	
	/**
	 * 发送json格式的post请求
	 * @author jianfei
	 * @date 2016年12月27日
	 * @company 金色世纪（技术部）
	 * @param url
	 * @param json
	 * @return
	 */
	public static String sendPostJson(String url,String json){
		//申明给服务端传递一个json串
	    //创建一个OkHttpClient对象
	    OkHttpClient okHttpClient = new OkHttpClient();
	    //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
	    RequestBody requestBody = RequestBody.create(JSON, json);
	    //创建一个请求对象
	    Request request = new Request.Builder()
	            .url(url)
	            .post(requestBody)
	            .build();
	    //发送请求获取响应
	    try {
	    Response response=okHttpClient.newCall(request).execute();
	        //判断请求是否成功
	        if(response.isSuccessful()){
	            //打印服务端返回结果
//	            Log.i(TAG,response.body().string());
	        	return response.body().string();
	        }else{
	        	return null;
	        }
	    } catch (IOException e) {
	        e.printStackTrace();
	        return null;
	    }
	}

}
